﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Business.Entities;

namespace Data.DataBase
{
    public class CursoAdapter : Data.Database.Adapter
    {
        private static List<Business.Entities.Curso> _Cursos;

        public static List<Business.Entities.Curso> Cursos
        {
            get
            {
                if (_Cursos == null)
                {
                    _Cursos = new List<Curso>();
                    Curso c;

                    c = new Curso();
                    c.Id = 1;
                    c.IdMaterial = 1;
                    c.IdComision = 1;
                    c.AnioCalendario = 2014;
                    c.Cupo = 40;
                    c.Descripcion = "Comunicaciones 2014 3k4";
                    c.State = Business.Entities.BusinessEntity.States.Unmodified;

                    _Cursos.Add(c);

                    c = new Curso();
                    c.Id = 2;
                    c.IdMaterial = 1;
                    c.IdComision = 2;
                    c.AnioCalendario = 2014;
                    c.Cupo = 60;
                    c.Descripcion = "Comunicaciones 2014 3k3";
                    c.State = Business.Entities.BusinessEntity.States.Unmodified;

                    _Cursos.Add(c);
                }
                return _Cursos;
            }
        }

        public Curso GetOne(int id)
        {
            return Cursos.Find(delegate(Business.Entities.Curso c) { return c.Id == id; });
        }

        public List<Curso> GetAll()
        {
            return new List<Curso>(Cursos);
        }

        public void Save(Business.Entities.Curso curso)
        {
            switch (curso.State)
            {
                case BusinessEntity.States.New:
                    int nuevoId = 0;
                    // esta busqueda podria reemplazarse por un OrderBy que orden por ID.
                    foreach (Curso c in Cursos)
                    {
                        if (c.Id > nuevoId)
                        {
                            nuevoId = c.Id;
                        }
                    }
                    curso.Id = nuevoId + 1;
                    Cursos.Add(curso);
                    break;
                case BusinessEntity.States.Modified:
                    Cursos[Cursos.FindIndex(delegate(Curso c) { return c.Id == curso.Id; })] = curso;
                    break;
                case BusinessEntity.States.Deleted:
                    this.Delete(curso);
                    break;
            }
            curso.State = BusinessEntity.States.Unmodified;
        }

        public void Delete(int id)
        {
            this.Delete(this.GetOne(id));
        }

        public void Delete(Business.Entities.Curso curso)
        {
            Cursos.Remove(curso);
        }
    }
}
